<?php
/**
 * Form_Select
 *
 * класс Form_Select позволяет работать с <select>
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.1
 */
class Form_Select extends Form_Element
{
  protected $_optionsArray = array(); //Массив options
  protected $_optionsArrayForTop = array(); //Массив options для вывода вверху списка

  protected $_defaultString; //Строка, отображаемая по умолчанию в дополнение к массиву
  protected $_useSimpleArray = true; //Использовать ли упрощенный масссив
  protected $_keyName; //поле массива, из которого брать ключ для options
  protected $_valueName; //поле массива, из которого брать  значение для options
  protected $_treeSelect = false; //древовидный селект
  protected $_treePrefix = '&nbsp;&nbsp;';
  protected $_chooseText = null; // Текст, который будет выводиться для выбора города

  function __construct(array $arrSettings = array(), $fieldName = null, $showInConstruct = false) {
    parent::__construct($arrSettings, $fieldName);
    if ($showInConstruct)
      $this->show();
  }
	/**
	 * Метод устанавливает свойство
	 *
	 * @param string $settingName
	 * @param mixed $settingValue
	 * @param string $additionalAllowedSettings
	 */
	public function setSetting($settingName, $settingValue, $additionalAllowedSettings = null) {
    switch ($settingName) {
    	case 'optionsArray':
    		$this->setOptionsArray($settingValue);
    		break;
      case 'chooseText':
        $this->_chooseText = $settingValue;
        break;
    	case 'optionsArrayForTop':
    		$this->setOptionsArrayForTop($settingValue);
    		break;
    	case 'keyName':
    		$this->setKeyName($settingValue);
    		break;
    	case 'valueName':
    		$this->setValueName($settingValue);
    		break;
    	case 'tree': case 'treeSelect':
    		$this->_treeSelect = $settingValue;
    		break;
    	case 'treePrefix':
    		$this->_treeSelect = true;
    		$this->_treePrefix = $settingValue;
    		break;
    	default:
    	  parent::setSetting($settingName, $settingValue, '"optionsArray", "optionsArrayForTop", "keyName", "valueName"');
			  break;
    }
  }
  /**
   * задет массив для элементов options
   *
   * @param array $optionsArrayForTop
   */
  public function setOptionsArrayForTop($optionsArrayForTop) {
    $this->_optionsArrayForTop = $optionsArrayForTop;
  }
  /**
   * задет массив для элементов options, которые должны выводиться сверху
   *
   * @param array $optionsArray
   */
  public function setOptionsArray($optionsArray) {
    $this->_optionsArray = $optionsArray;
  }
  /**
   * задет название ключа, по которому заполнять значение <option value="!!!!!"
   *
   * @param string $keyName
   */
  public function setKeyName($keyName) {
    $this->_keyName = $keyName;
    $this->_useSimpleArray = false;
  }
  /**
   * задет название ключа, по которому заполнять значение <option>!!!!!</option>
   *
   * @param string $valueName
   */
  public function setValueName($valueName) {
    $this->_valueName = $valueName;
    $this->_useSimpleArray = false;
  }
  /**
   * Выводит элемент
   *
   */
  public function show() {
  	$this->checkForErrors();
  	echo '<select';
  	$this->showElementAttributes();
  	//if ($this->_required) echo ' required="required"';
  	echo '>';

  	if (isset($this->_value)) $selectedValue = $this->_value;
  	elseif (isset($this->_defaultValue)) $selectedValue = $this->_defaultValue;

  	if ($this->_chooseText !== null) echo '<option value="">' . $this->_chooseText . '</option>';
  	
		if (!$this->_useSimpleArray) {
			$this->showOptions($this->_optionsArrayForTop, $this->_keyName, $this->_valueName, $selectedValue);
			$this->showOptions($this->_optionsArray, $this->_keyName, $this->_valueName, $selectedValue);
		}
		else {
			$this->showSimpleOptions($this->_optionsArrayForTop, $selectedValue);
			$this->showSimpleOptions($this->_optionsArray, $selectedValue);
		}
  	echo '</select>';
  	$this->showAfterElementMessage();
  }

  /**
   * Выводит options
   *
   * @param array $arrOptions
   * @param string $keyName
   * @param string $valueName
   * @param mixed $selectedValue
   */
  public function showOptions(array $arrOptions, $keyName, $valueName, $selectedValue = -1, $curPrefix = '') {
  	$optionsSize = sizeof($arrOptions);
  	for ($i = 0 ; $i < $optionsSize; $i++) {
      echo '<option';
       if ($curPrefix != '')
         echo ' style="font-style:italic;"';
       echo' value="' . $arrOptions[$i][$keyName] . '"';
      if ($arrOptions[$i][$keyName] == $selectedValue)
        echo ' selected="selected"';
      echo '>';
      	echo $curPrefix;
      	echo $arrOptions[$i][$valueName];
      echo '</option>';
      if ($this->_treeSelect && isset($arrOptions[$i]['children']))
        $this->showOptions($arrOptions[$i]['children'], $keyName, $valueName, $selectedValue, ($curPrefix . $this->_treePrefix) );
    }
  }

  /**
   * Выводит options
   *
   * @param array $arrOptions
   * @param mixed $selectedValue
   */
  public function showSimpleOptions(array $arrOptions, $selectedValue = -1) {
  	$optionsSize = sizeof($arrOptions);
  	foreach ($arrOptions as $key => $value) {
      echo '<option value="' . $key . '"';
      if ($selectedValue == $key)
        echo ' selected="selected"';
      echo '>' . $value . '</option>';

  	}
  }

  /**
   * Задет параметры массива. После этого уже не будет использоваться упрощенный вариант
   *
   * @param string $keyName
   * @param string $valueName
   */
  public function setArrayParametrs($keyName, $valueName) {
    $this->_useSimpleArray = false;
    $this->_keyName = $keyName;
    $this->_valueName = $valueName;
  }
}
?>